FILE: TAPE_INTE:TOS HEWLETT-PACKARD: TAPE_INTERFACE (c) Coleco 1983 Confidential Tue, 15 May 1984, 20:30 Page 1
1 ;^Z80^
3 ;NAME ^Rev 02 - GPB^
4
5 De_TAPE_INTERFACE MACRO ;Header Rev. 5
6 .GOTO Ede_TAPE_INTERFACE
7
8 Project: TAPE, C101
9
10 ******************************
11 * *
12 * TAPE_INTERFACE DTT *
13 * *
14 ******************************
15
16 Rev History
17 Rev. Date Name Change
18 2 11/2/83 GPB CHANGED RANGE TO RANGE_ ( duplicate symbol problem)
19 1 9/13/83 DTT CHANGED TO ALLOW ERROR RETIRES
20 0 7/5/83 DTT Initial Pseudo Code
21
22 Function:
23 REQUEST READS AND WRITES AS DEFINED IN OCB.
24 REQUESTS ABORT_TAPE.
25 TEST STATUS OF TAPE REQUEST.
26
27
28 Ede_TAPE_INTERFACE MEND
29 Pseudo_code_TAPE_INTERFACE MACRO ;Pseudocode macro area
30 BEGIN:
31 STORE OVERLAY_NUMBER
32 HL := POINTER TO OCB := OVERLAY_NUMBER*5 + OVERLAY_TABLE_POINTER
33 MOVE OCB TO CSA
34 IF WRITE THEN
35 SEND WRITE_COMMAND
36 ELSE
37 SEND READ_COMMAND
38 ENDIF
39 END
40 .GOTO Ep_TAPE_INTERFACE
41
42
43
44 Ep_TAPE_INTERFACE MEND
45
46 ;Subroutines called
47 ; EXT
48
49 ;Subroutines defined
50 GLOBAL TEST_TAPE
51 GLOBAL ABORT_TAPE
52 GLOBAL LOAD_OVERLAY
53 GLOBAL WRITE_OVERLAY
54 GLOBAL CALC_OCB_ADDR
55 GLOBAL WRITE_BLOCKS
56 GLOBAL LOAD_BLOCKS
FILE: TAPE_INTE:TOS HEWLETT-PACKARD: TAPE_INTERFACE (c) Coleco 1983 Confidential Tue, 15 May 1984, 20:30 Page 2
57 GLOBAL BLOCK_IO
58 ; GLOBAL
59
60 ;Operating system calls
61 ; EXT
62
63 ;Inputs/Outputs passed in registers
64 ; A = OVERLAY NUMBER 1 thru N
65 ; A <> 0 = ERROR
66
67 ;External data areas used
68 EXT OCB_PTR ;POINTER TO OVERLAY CONTROL TABLE
69
70 ;Global data areas defined
71 GLOBAL OVERLAY_NUMBER
72 GLOBAL TAPE_STATE
73 GLOBAL CSA
74 GLOBAL XFER_ADDR
75 GLOBAL BLOCK_NUM
76 GLOBAL RANGE_
77 ; GLOBAL
78
79 ;Local equates
80 ; EQU
81
82 ;Global equates
83 GLOBAL READ_TAPE
84 GLOBAL WRITE_TAPE
85 GLOBAL KILL_TAPE
86 0081 READ_TAPE EQU 81H
87 0082 WRITE_TAPE EQU 82H
88 0087 KILL_TAPE EQU 87H
89 ; INCLUDE File_name:userid
90
91
92 PROG
93
94 ; TEST FOR COMPLETION OF IO REQUEST
95 0000' TEST_TAPE:
96 0000' 3A 0200" LD A,(CSA)
97 0003' B7 OR A
98 0004' C3 3D00' JP EXIT_TAPE
99 ;*
100 ;*
101 ;*
102 0007' ABORT_TAPE:
103 0007' 3E 87 LD A,KILL_TAPE
104 0009' 32 0200" LD (CSA),A
105 000C' C3 3D00' JP EXIT_TAPE
106 ;*
107 ;*
108
109 000F' CALC_OCB_ADDR:
110 000F' 3D DEC A ;ADDR = OCB_TABLE(OV_NUM-1*5)
111 0010' 4F LD C,A ;GET THE OVERLAY NUMBER IN C
112 0011' 06 00 LD B,0
113 0013' 2A 0000# LD HL,(OCB_PTR) ;POINTER TO THE OCB TABLE
FILE: TAPE_INTE:TOS HEWLETT-PACKARD: TAPE_INTERFACE (c) Coleco 1983 Confidential Tue, 15 May 1984, 20:30 Page 3
114 0016' 09 ADD HL,BC ;OCB_ADDR = OVERLAY_NUM*5 + START_OF_TABLE
115 0017' 09 ADD HL,BC
116 0018' 09 ADD HL,BC
117 0019' 09 ADD HL,BC
118 001A' 09 ADD HL,BC
119 001B' C9 RET
120 ;*
121 001C' WRITE_OVERLAY:
122 001C' 37 SCF ;SET CARRY FLAG IF WRITE INSTRUCTION!
123 001D' 18 01 JR LD_1
124 ;*
125 ;*
126 001F' LOAD_OVERLAY:
127 001F' B7 OR A ;RESET CARRY FLAG IF READ
128 ;*
129 ;*
130 0020' LD_1:
131 ; BEGIN (Ordinarily registers are restored; retain only the pushes and pops you need.)
132 ;*
133 ;*
134 ;*
135 0020' 32 0000" LD (OVERLAY_NUMBER),A ;FOR DEBUGGING PURPOSES
136 ;*
137 ;*
138 0023' F5 PUSH AF ;++++++++++++++++++++;
139 0024' CD 0F00' CALL CALC_OCB_ADDR ;
140 0027' F1 POP AF ;--------------------; ;SAVE THE CARRY FLAG IF SET
141 ;*
142 0028' 30 04 JR NC,LOAD_BLOCKS
143
144 002A' WRITE_BLOCKS:
145 002A' 3E 82 LD A,WRITE_TAPE ;WRITE INSTRUCTIONS GO HERE
146 002C' 18 02 JR BLOCK_IO
147 002E' LOAD_BLOCKS:
148 002E' 3E 81 LD A,READ_TAPE ;READ INSTRUCTIONS GO HERE
149 0030' BLOCK_IO:
150 0030' 11 0300" LD DE,CSA+1 ; ;POINT TO THE COMMAND STATUS AREA
151 0033' 01 0500 LD BC,5 ; ;NUMBER OF BYTES TO MOVE
152 0036' ED B0 LDIR
153 0038' 11 0200" LD DE,CSA
154 003B' 12 LD (DE),A ;SET THE COMMAND IN THE CSA BUFFER
155 003C' AF XOR A
156 GLOBAL EXIT_TAPE
157 003D' EXIT_TAPE:
158 003D' C9 RET
159 ;*********************************************************************************************
160 DATA
161 0000" 0001 OVERLAY_NUMBER DEFS 1
162 0001" 0001 TAPE_STATE DEFS 1
163 0002" 0006 CSA DEFS 6
164 0003" XFER_ADDR EQU CSA+1
165 0005" BLOCK_NUM EQU XFER_ADDR+2
166 0007" RANGE_ EQU BLOCK_NUM+2
FILE: TAPE_INTE:TOS HEWLETT-PACKARD: TAPE_INTERFACE (c) Coleco 1983 Confidential Tue, 15 May 1984, 20:30 Page 4
0 Error(s) Detected. 62 Program Bytes. 8 Data Bytes.
20 Symbols Detected.
FILE: TAPE_INTE:TOS HEWLETT-PACKARD: TAPE_INTERFACE (c) Coleco 1983 Confidential Tue, 15 May 1984, 20:30 Page 5
Value Symbol Defined Referenced:
0007' ABORT_TAPE 102 51
0030' BLOCK_IO 149 57 146
0005" BLOCK_NUM 165 75 166
000F' CALC_OCB_ADDR 109 54 139
0002" CSA 163 73 96 104 150 153 164
003D' EXIT_TAPE 157 98 105 156
0087 KILL_TAPE 88 85 103
0020' LD_1 130 123
002E' LOAD_BLOCKS 147 56 142
001F' LOAD_OVERLAY 126 52
0000# OCB_PTR 68 113
0000" OVERLAY_NUMBER 161 71 135
0007" RANGE_ 166 76
0081 READ_TAPE 86 83 148
0001" TAPE_STATE 162 72
0000' TEST_TAPE 95 50
002A' WRITE_BLOCKS 144 55
001C' WRITE_OVERLAY 121 53
0082 WRITE_TAPE 87 84 145
0003" XFER_ADDR 164 74 165